package com.ruoyi.ftrl.mqtt.service;

import com.ruoyi.ftrl.io.server.TioConfig;
import com.ruoyi.ftrl.io.server.domain.SendPacket;
import com.ruoyi.ftrl.mapper.HeatStationMapper;
import org.eclipse.paho.client.mqttv3.*;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.tio.core.Tio;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
public class MqttSubscriberService {


    private static final String BROKER_URL = "tcp://localhost:1883"; // EMQX 服务器地址
    private static final String CLIENT_ID = "ClientSubscriber";
    private static final String TOPIC = "devicetopic"; // 要订阅的主题

    private MqttClient mqttClient;

    @PostConstruct
    public void init() {
        try {
            mqttClient = new MqttClient(BROKER_URL, CLIENT_ID);
            MqttConnectOptions options = new MqttConnectOptions();
            options.setCleanSession(true);

            mqttClient.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    System.err.println("MQTT连接丢失: " + cause.getMessage());
                }

                @Override
                public void messageArrived(String topic, MqttMessage message) {
                    String msg = new String(message.getPayload());
                    System.out.println("收到主题 " + topic + " 的消息: " + msg);
                    // 处理接收到的数据（反向控制）
                    processMessage(msg);
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    // 可实现消息确认逻辑
                }
            });

            mqttClient.connect(options); // 连接到 MQTT Broker
            System.out.println("MQTT 客户端连接成功!");

            mqttClient.subscribe(TOPIC); // 订阅主题
            System.out.println("已订阅主题: " + TOPIC);

        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    public void processMessage(String data) {
        // 1.解码和设备控制逻辑(控制设备)2.接收设备发送的数据（数据库存储）
        //首先判断此数据是 设备发送的数据进行持久化 还是 发送给设备的数据进行设备控制 （根据消息格式进行判断）
        System.out.println("开始处理消息: " + data);
        if (data.length()<10){//为设备发送的数据进行持久化
            System.err.println("为设备发送的数据进行持久化");
        }else{//发送给设备的数据进行设备控制
            SendPacket sendPacket = new SendPacket();
            sendPacket.setBody(data);
            String sid = data.substring(18, 20) + data.substring(16, 18);
            String s = String.valueOf(Integer.parseInt(sid, 16));
//            Tio.sendToUser(TioConfig.tioServerConfig, "10", sendPacket);
            Tio.sendToUser(TioConfig.tioServerConfig, s, sendPacket);
            System.out.println("发送的编号 = " + s);
            System.err.println("为发送给设备的数据进行设备控制");

        }
        // 示例：假设数据是 JSON 格式
        try {
//            JSONObject jsonObject = new JSONObject(data);
//            String deviceId = jsonObject.getString("deviceId");
//            String payload = jsonObject.getString("payload");
//
//            // 在这里实现设备控制逻辑，例如：
//            controlDevice(deviceId, payload);
        } catch (JSONException e) {
            e.printStackTrace();
            System.err.println("解码消息失败: " + e.getMessage());
        }
    }

    private void controlDevice(String deviceId, String payload) {
        // 实际的设备控制逻辑，例如调用外部 API 和设备交互
        System.out.println("控制设备 ID: " + deviceId + "，载荷: " + payload);
        // 在这里添加实际的设备控制逻辑
    }

    @PreDestroy
    public void cleanup() {
        if (mqttClient != null) {
            try {
                mqttClient.disconnect();
                System.out.println("MQTT 客户端已断开连接.");
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }
    }
}




//package com.ruoyi.ftrl.mqtt.service;
//
//import org.eclipse.paho.client.mqttv3.*;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//
//@Service
//public class MqttSubscriberService {
//
//    private static final String BROKER_URL = "tcp://localhost:1883"; // EMQX 服务器地址
//    private static final String CLIENT_ID = "ClientSubscriber";
//    private static final String TOPIC = "devicetopic"; // 要订阅的主题
//
//    private MqttClient mqttClient;
//
//    @PostConstruct
//    public void init() {
//        try {
//            // 创建 MQTT 客户端
//            mqttClient = new MqttClient(BROKER_URL, CLIENT_ID);
//            MqttConnectOptions options = new MqttConnectOptions();
//            options.setCleanSession(true); // 保持连接状态
//
//            // 设置回调方法
//            mqttClient.setCallback(new MqttCallback() {
//                @Override
//                public void connectionLost(Throwable cause) {
//                    System.err.println("MQTT连接丢失: " + cause.getMessage());
//                }
//
//                @Override
//                public void messageArrived(String topic, MqttMessage message) {
//                    String msg = new String(message.getPayload());
//                    System.out.println("收到主题 " + topic + " 的消息: " + msg);
//                    // 这里可以添加对接收到的数据进行的处理逻辑
//                    System.err.println("我现在要对订阅的这个设备发送的消息进行数据解码了！！！");
//                }
//
//                @Override
//                public void deliveryComplete(IMqttDeliveryToken token) {
//                    // 可以实现消息确认逻辑
//                }
//            });
//
//            mqttClient.connect(options); // 连接到 MQTT Broker
//            System.out.println("MQTT 客户端连接成功!");
//
//            mqttClient.subscribe(TOPIC); // 订阅主题
//            System.out.println("已订阅主题: " + TOPIC);
//
//        } catch (MqttException e) {
//            e.printStackTrace();
//        }
//    }
//
//    @PreDestroy
//    public void cleanup() {
//        // 在 Spring 应用关闭时断开连接
//        if (mqttClient != null) {
//            try {
//                mqttClient.disconnect();
//                System.out.println("MQTT 客户端已断开连接.");
//            } catch (MqttException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//}